package com.rbn.stockmobiledevices.dispositivos.internal;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import com.rbn.stockmobiledevices.dispositivos.Dispositivo;
import com.rbn.stockmobiledevices.dispositivos.DispositivoManager;
import com.rbn.stockmobiledevices.entradas.Estado;

public class HibernateDispositivoManager implements DispositivoManager{

	private SessionFactory sessionFactory;

	public HibernateDispositivoManager(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Dispositivo> getAll() {
		return getCurrentSession().createQuery("from Dispositivo").list();
	}

	@Transactional(readOnly = true)
	public Dispositivo getById(String codigo) {
		return (Dispositivo) getCurrentSession().get(Dispositivo.class, codigo);
	}

	@Transactional
	public void update(Dispositivo dispositivo) {
		getCurrentSession().update(dispositivo);
	}

	@Transactional
	public void remove(Dispositivo dispositivo) {
		getCurrentSession().delete(dispositivo);

	}
	
	
//	@SuppressWarnings("unchecked")
//	public List<Dispositivo> getByModelo(String modelo) {
//		Session session = getCurrentSession();
//		String hlqQuery = "from Dispositivo d";
//
//		if (modelo != null && modelo.trim().length() > 0) {
//			hlqQuery += " where d.modelo like '%" + modelo + "%'";
//		}
//		hlqQuery += " order by modelo";
//		Query q = session.createQuery(hlqQuery);
//		
//		return q.list();
//	}

	@Transactional
	public void save(Dispositivo dispositivo) {
		getCurrentSession().save(dispositivo);
	}

	@Transactional
	public boolean remove(String codigo) {
		Dispositivo d = this.getById(codigo);
		if(d==null)
			return false;
		getCurrentSession().delete(d);
		return true;
	}

	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Dispositivo> getPaginadoDispositivos(Integer startPosition,
			Integer pageSize, String modelo) {
		Session session = getCurrentSession();
		String hlqQuery = "from Dispositivo d";

		if (modelo != null && modelo.trim().length() > 0) {
			hlqQuery += " where modelo like :modelo";
		}
		
		hlqQuery += " order by modelo";
		Query q = session.createQuery(hlqQuery);
		
		if(modelo != null && modelo.trim().length() > 0){
			q.setString("modelo","%" + modelo + "%");
		}
		
		if(startPosition != null && pageSize != null){
			q.setFirstResult(startPosition);
			q.setMaxResults(pageSize);
		}
				
		return q.list();
	}
	
	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Estado> getPaginadoEstados(Integer startPosition,
			Integer pageSize, String search) {
		
		Session session = getCurrentSession();
		String hlqQuery = "from Estado e";

		if (search != null && search.trim().length() > 0) {
			hlqQuery += " where e.estado like :estado";
		}
		hlqQuery += " order by e.id";
		
		Query q = session.createQuery(hlqQuery);
		
		if (search != null && search.trim().length() > 0) {
			q.setString("estado", "%" + search + "%");
		}
		
		if(startPosition != null && pageSize != null){
			q.setFirstResult(startPosition);
			q.setMaxResults(pageSize);
		}
		return q.list();
	}
	
	protected Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}
}
